#include "cfjugador.h"
#include <string>
#include <iostream>
#include <FlexLexer.h>
#include "conffile.h"

using namespace std;

CFJugador::CFJugador()
{
    image = NULL;
    frame_n = 0;
    i = 0;
}

CFJugador::CFJugador(Image *img,
               unsigned int w,
               unsigned int h)
{
    // Un poco de inicializacion ... 
    frame_rect.w = w;
    frame_rect.h = h;
    image = img;
    frame_n = 0;
    estado = ST_DEPIE;
    energia = 100;
    especial = 0;
    vx = 0;
    vy = 0;
}

CFJugador::~CFJugador()
{

}

void CFJugador::draw(SDL_Surface *surf)
{
    SDL_Rect dest;
    dest.w = frame_rect.w;
    dest.h = frame_rect.h;

    dest.x = x;
    dest.y = y;

    frame_rect.x = 0;
    frame_rect.y = frame_n*(frame_rect.h);

    if(mirror)
        image->draw(&frame_rect,surf,&dest);
    else
        image->drawFlipped(&frame_rect,surf,&dest);
}

void CFJugador::update(unsigned int time_delta)
{
    //TODO: Implementar esta funcion para el sprite CFJugador
    x += vx;
    y += vy;
    switch(estado)
    {
        // Las animaciones con loop
        case ST_ALANTE:
        case ST_ATRAS:
        case ST_DEPIE:
        case ST_MUERTO:
        case ST_POSE:
        case ST_SALTO:

        i++;
        if(i >= anim_vecs[estado].size())
            i = 0;
        frame_n = anim_vecs[estado][i].frame;
        break;

        default:
        i++;
         if(i >= anim_vecs[estado].size()){
            i = 0;
            if(estado == ST_SPATA || estado == ST_SPUNYO)
                estado = ST_SALTO;
            else 
                 estado = ST_DEPIE;
            
         }
        frame_n = anim_vecs[estado][i].frame;
        break;
    }
}

void CFJugador::patada()
{
    // patada solo cancela el estado salto & depie
    switch(estado){
        case ST_SALTO:
            estado = ST_SPATA;
            i = 0;
            break;
        case ST_DEPIE:
            estado = ST_PATA;
            i = 0;
            break;
    }
}

void CFJugador::punyo()
{
    // puño solo cancela el estado salto & depie
    switch(estado){
        case ST_SALTO:
            estado = ST_SPUNYO;
            i= 0;
            break;
        case ST_DEPIE:
            estado = ST_PUNYO;
            i=0;
            break;
    }

}

void CFJugador::alante()
{
    cerr << "Palante\n";
    //  alante solo cancela de pie atras y alante
    switch(estado){
        case ST_DEPIE:
        case ST_ALANTE:
        case ST_ATRAS:
            estado = ST_ALANTE;
            i=0;
            break;
    }
}


void CFJugador::atras()
{
    cerr << "Patras\n";
    //  alante solo cancela de pie atras y alante
    switch(estado){
        case ST_DEPIE:
        case ST_ALANTE:
        case ST_ATRAS:
            estado = ST_ATRAS;
            i=0;
            break;
    }
}

void CFJugador::golpear()
{
    cerr << "Ay\n";
    
    if(estado != ST_SALTO &&
            estado != ST_SPUNYO &&
            estado != ST_SPATA){
    estado = ST_GOLPEA;
    i = 0;
    }
}

void CFJugador::salto()
{
    cerr << "Salto\n";
    //  alante solo cancela de pie atras y alante
    switch(estado){
        case ST_DEPIE:
        case ST_ALANTE:
        case ST_ATRAS:
            estado = ST_SALTO;
            i=0;
            break;
    }
}

void CFJugador::especial1()
{
 if (estado == ST_DEPIE){
     estado = ST_SPECIAL1;
     i=0;
 }
}


void CFJugador::bloquear()
{
 if (estado == ST_DEPIE){
     estado = ST_BLOQUEA;
     i=0;
 }
}

void CFJugador::loadConf(const char *path)
{    
    // Altura/anchura del frame de animacion
    int w, h;
    // Ruta al directorio de personaje
    string p = path;
    // Avatar del personaje
    //avatar = new Image( (p+"/avatar.png").c_str());
   
    // Inicializamos los vectores de animacion
    ConfFile  inifile;
    inifile.load(p+"/anim.ini");

    // Archivo PNG con las anims
    image = new Image( (p+"/anim.png").c_str());


    w = inifile.getInt("global","frame_w");
    h = inifile.getInt("global","frame_h");

    /* Inicializamos los vectores de animacion */
    anim_vecs.resize(13);
    vector<int> tmp = inifile.getIntList("ST_DEPIE","vec_anim");

    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_DEPIE].push_back(ftmp);
    }

    tmp = inifile.getIntList("ST_SALTO","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_SALTO].push_back(ftmp);
    }
    
    tmp = inifile.getIntList("ST_PUNYO","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_PUNYO].push_back(ftmp);
    }

    tmp = inifile.getIntList("ST_PATA","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_PATA].push_back(ftmp);
    }

    tmp = inifile.getIntList("ST_SPUNYO","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_SPUNYO].push_back(ftmp);
    }

    tmp = inifile.getIntList("ST_SPATA","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_SPATA].push_back(ftmp);
    }
   
    tmp = inifile.getIntList("ST_SPECIAL1","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_SPECIAL1].push_back(ftmp);
     }

    tmp = inifile.getIntList("ST_POSE","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_POSE].push_back(ftmp);
    }
    tmp = inifile.getIntList("ST_ALANTE","vec_anim");
     for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_ALANTE].push_back(ftmp);
    }
    tmp = inifile.getIntList("ST_ATRAS","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_ATRAS].push_back(ftmp);
    }
    tmp = inifile.getIntList("ST_GOLPEA","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_GOLPEA].push_back(ftmp);
    }
    
    tmp = inifile.getIntList("ST_MUERTO","vec_anim");
    for (int i = 0; i < tmp.size(); i++){
        frame_anim ftmp;
        ftmp.frame = tmp[i];
        anim_vecs[ST_MUERTO].push_back(ftmp);
    }
 
      
    // Resto de inicializacion 
    frame_rect.w = w;
    frame_rect.h = h;
    frame_n = 0;
    estado = ST_DEPIE;
    energia = 100;
    especial = 0;
}


void CFJugador::parar()
{
    
   cerr << "Parar\n"; 
   estado = ST_DEPIE;
   i = 0;
}

void CFJugador::morir()
{
    estado = ST_MUERTO;
    i = 0;
}

void CFJugador::ganar()
{
    estado = ST_POSE;
    i = 0;
}
// ex: set cindent expandtab softtabstop=4 shiftwidth=4 tabstop=4:*/
